﻿#pragma once
#include "Scene/Scene.h"
#include "Character/Player.h"
#include "Character/monster/Monster.h"
#include "Character/npc/Npc.h"
#include "Rebot/RebotMgr.h"
#include "IDuplicateState.h"
#include "Common/TableData/DuplicateDuplicateCfg.h"
#include "Common/CharacterDefine.h"
#include "Common/UnionDefine.h"

struct IBrushMonster;
struct ICond;
class IDuplicate : public IDuplicateState
{
public:
	//初始匿 
	virtual bool Init(uint32_t nDuplicateID, uint32_t nSceneID, IBrushMonster *pBrush) = 0;
	//
	virtual void UnInit() = 0;
	//获取副本ID
	virtual uint32_t GetDuplicateID() = 0;
	//获取场景ID
	virtual uint32_t GetSceneID() = 0;
	//获取地图IDS
	virtual uint32_t GetMapID() = 0;
	//获取开始时闿
	virtual uint64_t GetStartTime() = 0;
	//获取刷怪类垿
	virtual int8_t GetType() = 0; 
	//获取副本额外参数
	virtual DExParam &GetExParam() = 0;
	//获取副本配置信息
	virtual const DuplicateDuplicateCfgInfo *GetDuplicateCfgInfo() = 0;
	//是否能进兿
	virtual bool CanEnter(Creature *pCreature) = 0;
	//进入副本
	virtual bool EnterDuplicate(Creature *pCreature,Point3<float> &pos) = 0;
	//离开副本
	virtual int32_t LeaveDuplicate(Player *pPlayer, bool retMainCity = false) = 0;
	//复活（已废弃）
	virtual bool Relive(Player *pPlayer, int8_t byType) = 0;
	//是否能复活
	virtual bool CanRelive(CharIDType charId) = 0;
	//复活
	virtual bool Relive(Player *pPlayer) = 0;
	//是否刷完所有副本怿
	virtual bool FinishBrush() = 0;
	//是否处于抽奖状怿
	virtual bool IsFlopState() = 0;
	//是否结束
	virtual bool IsEnd() = 0;
	//获取刷怪数捿
	virtual AllBrushDataCfg *GetBrushData() = 0;
	//初始化脚朿
	virtual bool InitScript() = 0;
	//进入区域
	virtual bool EnterArea(uint32_t nAreaID) = 0;
	//开始刷第几波怪物亿
	virtual void StartBrushWave(int32_t wave) = 0;
	//获取玩家复活次数
	virtual int32_t PlayerReliveNum(CharIDType cid) = 0;
	//玩家是否曾经进入副本
	virtual bool OnceEnter(CharIDType cid) = 0;
	//设置玩家是否可获得奖势
	virtual void SetCanReward(CharIDType cid, bool canReward) = 0;
	//获取玩家是否可获得奖势
	virtual bool CanReward(CharIDType cid) = 0;
	//获取死亡怪物数量
	virtual uint32_t GetDieMonsterNum(uint32_t monsterId) = 0;
	//获取额外的死亡怪怪物数量
	virtual uint32_t GetDieMonsterNumExcept(SET_UINT32 &setExcept) = 0;
	//获取怪物剩余数量
	virtual int32_t GetMonsterNum() = 0;
	//获取指定怪物类型序列剩余数量
	virtual int32_t GetMonsterNum(SET_INT32 &setType) = 0;
	//获取指定怪物ID的剩余数量
	virtual int32_t GetMonsterLeftNum(uint32_t monsterId) = 0;
	//获取指定怪物ID的总数量
	virtual int32_t GetMonsterTotalNum(uint32_t monsterId) = 0;
	//开始刷怿
	virtual uint64_t StartBrushTime() = 0;
	//获取副本剩余时间
	virtual int32_t LeftSec() = 0;
	//获取玩家进入之前的区埿
	virtual uint32_t GetBeforeArea(CharIDType charId) = 0;
	//获取塔的信息
	virtual void GetTowerInfo(uint64_t &curHp, uint64_t &maxHp) = 0;
	//获取以传送的怪物数量
	virtual int32_t GetTransNum() = 0;
	//副本场景广播
	virtual void BroadCastData(uint16_t moduleId, uint16_t cmdId, ProtoBufBase *pbuf) = 0;
	//获取星级状怿
	virtual int8_t GetStartState(MAP_INT8_INT8 &mapState) = 0;
	//工会解散
	virtual void UnionDismiss() = 0;
	//踢出玩家
	virtual void KickPlayer(CharIDType charId) = 0;
	//是否能使用药牿
	virtual bool CanUseItem() = 0;
	//开始挑房
	virtual int32_t StartChallenge(CharIDType charId) = 0;
	//获取功勋
	virtual int32_t GetExploit(CharIDType charId) = 0;
	//购买功勋商店物品  costExploit : 购买物品需要消耗的功勋
	virtual void BuyExploitItem(CharIDType charId,int32_t costExploit) = 0;
	//获取瘟疫之战丿感染者和生还者数釿
	virtual void GetPestilenceNum(int32_t &injectNum, int32_t &surviveNum) = 0;
	//获取瘟疫之战持续时间和变身ID
	virtual void GetPestilenceContiAndTransID(int32_t &contiSec, int32_t &injectTransId, int32_t &surviveTransId) = 0;
	//获取玩家阵营
	virtual int8_t GetDupCharCamp(CharIDType charId) = 0;
	//获取阻挡配置
	virtual AllBlockDataCfg *GetBlockCfg() =  0;
	//获取阻挡状怿
	virtual void GetBlockState(MAP_UINT32_INT8 &mapBlockState) = 0;
	//活动状怿
	virtual void ActivityState(uint32_t actId, int32_t state, SUnionActParam &param) = 0;
	//绑定工会驻地场景
	virtual void BindUnionHome() = 0;
	//更会等级更新
	virtual void UnionLevel(int32_t unionLev) = 0;
	//NPC对话
	virtual int32_t NpcTalk(CharIDType charId, uint32_t activityId, uint64_t npcCid, int32_t reply, int8_t &type) = 0;
	//工会精英平均等级
	virtual int32_t UnionAverageLev() = 0;
	//工会首领外观
	virtual void UnionLeaderFacade(CharOutward *pNpcFacade) = 0;
	//是否脚本刷出的怪物全部死亡
	virtual bool IsBrushMonsAllDie() = 0;
	//工会地宫关闭
	virtual void UnionDungeonClose() = 0;
	//离开队伍
	virtual void LeaveTeam(CharIDType charId) = 0;
	//离开房间
	virtual void LeaveRoom(CharIDType charId) = 0;
	//重连数据
	virtual void OnReconnect(CharIDType cid) = 0;
	//获取指定怪物组的怪物
	virtual void GetMonsByGroup(SET_INT32 &setGroup, MAP_UINT32_SET_UINT64 &mapGroupMons) = 0;
	//积分怪物死亡
	virtual void ScoreMonsDie(uint32_t monsId, int32_t count, int8_t byBoss, uint64_t killerCid) = 0;
	//拾取掉落
	virtual void PickDrop(CharIDType cid, string &strName, int32_t prof, int32_t sex, VEC_ITEM_PROTO_EX &vecPickDrop) = 0;
	//设置副本掉落数据
	virtual void SetDropData(DupAllDropProto &protoData) = 0;	
	//获取新手引导当前的步骤索引
	virtual int32_t GetCurGuideIdx() = 0;
};



